package com.system.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import com.system.base.MyRejectedHandler;
import com.system.base.RedisUtil;
import com.system.util.MyThreadPoolTaskExecutor;

import java.lang.Integer;

/**
 * 线程池配置
 * 
 * @Package: com.steel.system.config
 * @ClassName: ExecutorConfig.java
 * 
 * @author kaifa008
 * @date 2019年7月23日 下午2:01:23
 * @Copyright: 2019 Copyright (c) 2018 LgSteel
 */
@Configuration
public class ExecutorConfig {

	@Value("${executor.commonExecutor.corePoolSize}")
	private Integer corePoolSize;
	@Value("${executor.commonExecutor.maximumPoolSize}")
	private Integer maximumPoolSize;
	@Value("${executor.commonExecutor.capacity}")
	private int capacity;

	@Autowired
	private RedisUtil redisUtil;

	@Bean("taskExecutor")
	public ThreadPoolTaskExecutor getTaskExecutor() {
		MyThreadPoolTaskExecutor taskExecutor = new MyThreadPoolTaskExecutor();
		// 核心线程数：线程池创建时候初始化的线程数
		taskExecutor.setCorePoolSize(corePoolSize);
		// 最大线程数：线程池最大的线程数，只有在缓冲队列满了之后才会申请超过核心线程数的线程
		taskExecutor.setMaxPoolSize(maximumPoolSize);
		// 缓冲队列：用来缓冲执行任务的队列
		taskExecutor.setQueueCapacity(capacity);
		// 允许线程的空闲时间60秒：当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
		taskExecutor.setKeepAliveSeconds(60);
		// 线程池名的前缀：设置好了之后可以方便我们定位处理任务所在的线程池
		taskExecutor.setThreadNamePrefix("asyncTask-");
		// 若需要在关闭线程池时等待当前调度任务完成后才开始关闭，可以通过简单的配置，进行优雅的停机策略配置。
		// 调度器shutdown被调用时等待当前被调度的任务完成，默认false，配合setAwaitTerminationSeconds
		taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
		// 等待时长
		taskExecutor.setAwaitTerminationSeconds(60);
		// 设置策略
		taskExecutor.setRejectedExecutionHandler(new MyRejectedHandler(redisUtil));
		taskExecutor.afterPropertiesSet();
		return taskExecutor;
	}

}